package com.cjq.wx.Controller;

import com.cjq.bean.BootStrapTableExpress;
import com.cjq.bean.Express;
import com.cjq.bean.Message;
import com.cjq.bean.WxUser;
import com.cjq.mvc.ResponseBody;
import com.cjq.service.ExpressService;
import com.cjq.util.DateFormatUtil;
import com.cjq.util.JSONUtil;
import com.cjq.util.UserUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

public class ExpressController {

    @ResponseBody("/wx/findExpressByUserPhone.do")
    public String findByUserPhone(HttpServletRequest req, HttpServletResponse resp){
        WxUser wxUser = UserUtil.getWxUser(req.getSession());     //获取存在session的WxUser对象
        String phone = wxUser.getPhone();                       //获取用户的手机号
        List<Express> list = ExpressService.findByUserPhone(phone);    //通过手机号查询这个用户的所有快递
        List<BootStrapTableExpress> list2 = new ArrayList<>();
        for (Express e : list) {
            String code = e.getCode()==null?"已取件":e.getCode();
            String inTime = DateFormatUtil.format(e.getInTime());
            String outTime = e.getOutTime()==null?"未出库":DateFormatUtil.format(e.getInTime());
            String status = e.getStatus()==0?"待取件":"已取件";
            BootStrapTableExpress e1 = new BootStrapTableExpress(e.getId(),e.getNumber(),e.getUserName(),e.getUserPhone(),e.getCompany(),code,inTime,outTime,status,e.getSysPhone());
            list2.add(e1);
        }

        Message msg = new Message();
        if (list2.size()==0){
            msg.setStatus(-1);
            msg.setResult("未有过快递记录");
        }else {    //如果list是有内容的
            msg.setStatus(0);
            //list.stream()  表示将list集合转换为一个流，这个流的操作与原先的list不会产生影响（流是不操作原本的list集合数据的）
            //通过流的方式对列表进行更好的处理         filter相当于一个过滤的作用，   在流中保留 取件状态为未取件的快递 对象
            Stream<BootStrapTableExpress> status0Express = list2.stream().filter(express -> {
                if (express.getStatus().equals("待取件")){
                    return true;
                }else {
                    return false;
                }
            }).sorted((o1,o2)->{              //sorted  进行排序，比较哪个快递的入库时间跟接近现在  返回的结果是整数或负数
                long o1Time = DateFormatUtil.toTime(o1.getInTime());
                long o2Time = DateFormatUtil.toTime(o2.getInTime());
                return (int)(o1Time-o2Time);
            });


            //保留下取件状态为：已取件的快递状态
            Stream<BootStrapTableExpress> status1Express = list2.stream().filter(express -> {
                if (express.getStatus().equals("已取件")){
                    return true;
                }else {
                    return false;
                }
            }).sorted((o1,o2)->{         //进行比较，比较哪个快递的入库时间跟接近现在  返回的结果是整数或负数
                long o1Time = DateFormatUtil.toTime(o1.getInTime());
                long o2Time = DateFormatUtil.toTime(o2.getInTime());
                return (int)(o1Time-o2Time);
            });

            Object[] s0 = status0Express.toArray();    //将流又转换为数组
            Object[] s1 = status1Express.toArray();
            Map data = new HashMap<>();
            data.put("status0",s0);
            data.put("status1",s1);
            msg.setData(data);
        }
        String json = JSONUtil.toJSON(msg);
        return json;


    }



    @ResponseBody("/wx/userExpressList.do")
    public String expressList(HttpServletRequest req,HttpServletResponse resp){
        String userPhone = req.getParameter("userPhone");
        System.out.println(userPhone);
        List<Express> list = ExpressService.findBySysPhoneAndStatus(userPhone);    //查找所有未取件的快递信息
        List<BootStrapTableExpress> list2 = new ArrayList<>();
        for (Express e : list) {
            String code = e.getCode()==null?"已取件":e.getCode();
            String inTime = DateFormatUtil.format(e.getInTime());
            String outTime = e.getOutTime()==null?"未出库":DateFormatUtil.format(e.getInTime());
            String status = e.getStatus()==0?"待取件":"已取件";
            BootStrapTableExpress e1 = new BootStrapTableExpress(e.getId(),e.getNumber(),e.getUserName(),e.getUserPhone(),e.getCompany(),code,inTime,outTime,status,e.getSysPhone());
            list2.add(e1);
        }


        Message msg = new Message();
        if (list.size()==0){
            msg.setStatus(-1);
            msg.setResult("未查询到快递");
        }else{
            msg.setStatus(0);
            msg.setResult("查询成功");
            msg.setData(list2);
        }
        return JSONUtil.toJSON(msg);
    }
}
